package com.tcc.util_xbenben.utils;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 流工具类
 *
 * @author tcc
 */
public class StreamUtil {

    // 1.批量关闭流
    public static void closings(AutoCloseable... closeables) throws Exception {
        // 非空判断
        if (closeables != null) {
            // 循环关闭
            for (AutoCloseable auto : closeables) {
                // 非空判断
                if (auto != null) {
                    auto.close();
                }
            }
        }
    }

    // 2.流处理
    // 2-1 自定义流是否关闭
    private static void copy(InputStream inputStream, OutputStream outputStream, boolean closeInputStream,
                             boolean closeOutputStream) throws Exception {
        // 用于复制的字节数组
        byte[] b = new byte[1024];
        int len = 0;
        // 复制，如果读取到的数据 >0 ,有数据
        while ((len = inputStream.read(b)) > 0) {
            // 将数据写入输出流
            outputStream.write(b, 0, len);
        }
        // 关闭流
        if (closeInputStream) {
            inputStream.close();
        }
        if (closeOutputStream) {
            outputStream.close();
        }
    }

    // 2-2 默认不关闭
    public static void copy(InputStream inputStream, OutputStream outputStream) throws Exception {
        copy(inputStream, outputStream, false, false);
    }

    // 3.读取流
    // 3-1 自定义编码格式和是否关闭流
    public static String asString(InputStream inputStream, String encode, boolean isClose) throws Exception {
        // 存放结果
        StringBuffer sb = new StringBuffer();
        // 用于复制的字节数组
        byte[] b = new byte[1024];
        int len = 0;
        // 复制，如果读取的个数 > 0，证明读取到了数据
        while ((len = inputStream.read(b)) > 0) {
            // 将数据写入StringBuffer
            sb.append(new String(b, 0, len, encode));
        }
        // 关流
        if (isClose) {
            closings(inputStream);
        }
        return sb.toString();
    }

    // 3-2 自定义是否关闭流（默认编码格式）
    public static String asString(InputStream inputStream, boolean isClose) throws Exception {
        return asString(inputStream, "UTF-8", isClose);
    }

    // 3-3 默认编码格式并且关闭流
    public static String asString(InputStream inputStream) throws Exception {
        return asString(inputStream, true);
    }

    // 4.读取文本文件
    // 4-1 默认编码格式
    public static String asString(File textFile) throws Exception {
        return asString(new FileInputStream(textFile));
    }

    // 4-2 默认编码格式，自定义流处理
    public static String asString(File textFile, boolean isClose) throws Exception {
        return asString(new FileInputStream(textFile), isClose);
    }

    // 4-3 指定编码格式，自定义流处理
    public static String asString(File textFile, String encode, boolean isClose) throws Exception {
        return asString(new FileInputStream(textFile), encode, isClose);
    }

    // 5.按行读取文本文件（返回List集合）
    // 5-1 自定义编码格式
    public static List<String> readingLineFormTextFile(File textFile, String encode) throws Exception {
        // 存放结果
        List<String> list = new ArrayList<String>();
        // 字符输入流(文件读取流)
        FileReader fr = new FileReader(textFile);
        // 缓冲字符输入流
        BufferedReader br = new BufferedReader(fr);
        // 用于存入复制的数据
        String str = null;
        // 复制，如果读取的不为空，证明读取到了数据
        while ((str = br.readLine()) != null) {
            list.add(str);
        }
        // 关流
        closings(br);
        closings(fr);
        return list;
    }

    // 5-2 默认UTF-8格式
    public static List<String> readingLineFormTextFile(File textFile) throws Exception {
        return readingLineFormTextFile(textFile, "UTF-8");
    }

}
